import 'package:flutter/cupertino.dart';

/*
  百度语音ios、android错误码常量
 */
class BaiduSpeechErrorResponse {
  int errCode;
  String errMessage;

  BaiduSpeechErrorResponse({
    this.errCode,
    this.errMessage,
  });
}

class BaiduSpeechErrorCode {
  /*
  * IOS错误码
  * */
  //首次使用离线引擎请联网，并配置正确的app_id BDS_ASR_OFFLINE_APP_CODE, 绑定BundleId
  static const int IOS_ERR_NO_LICENSE = 2228226;

  //音频质量过低，无法识别
  static const int IOS_ERR_SPEECH_QUAILTY = 2225219;

  //识别失败，无法识别。(语法模式下，可能为语音不在自定义的语法规则之下)
  static const int IOS_ERR_RECOGNITION_FAILED = 2228236;

  //grammar文件无效 ，请设置 BDS_ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH
  static const int IOS_ERR_NO_BDS_ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH = 2228231;

  //dat模型文件不可用，请设置 BDS_ASR_OFFLINE_ENGINE_DAT_FILE_PATH
  static const int IOS_ERR_NO_BDS_ASR_OFFLINE_ENGINE_DAT_FILE_PATH = 2228231;

  //协议参数错误
  static const int IOS_ERR_PROTOCOL = 3001;

  //识别过程出错
  static const int IOS_ERR_IDENTIFY_PROGRESS = 3002;

  //没有找到匹配结果
  static const int IOS_ERR_NO_MATCH = 3003;

  //PID设置错误
  static const int IOS_ERR_PID = 3004;

  //声音质量不符合要求
  static const int IOS_ERR_SERVER_SPEECH_QUAILTY = 3005;

  //语音录入过长，请勿超过60s
  static const int IOS_ERR_LONG_TIME = 3006;

  /*
  * IOS错误码
  * */

  /*
  * Android错误码
  * */

  //出现原因可能为网络已经连接但质量比较差，建议检测网络状态
  static const int ANDROID_ERR_LONG_TIME = 1;

  //出现原因可能是网络权限被禁用，或网络确实未连接，需要开启网络或检测无法联网的原因
  static const int ANDROID_ERR_NO_NETWORK = 2;

  //出现原因可能为：未声明录音权限，或 被安全软件限制，或 录音设备被占用，需要开发者检测权限声明。
  static const int ANDROID_ERR_ = 3;

  //出现原因可能是appid和appkey的鉴权失败
  static const int ANDROID_ERR_PROTOCOL = 4;

  //一般是开发阶段的调用错误，需要开发者检测调用逻辑或对照文档和demo进行修复。
  static const int ANDROID_ERR_CODE = 5;

  //语音过长，请配合语音识别的使用场景，如避开嘈杂的环境等
  static const int ANDROID_ERR_LONG_SPEECH = 6;

  //信噪比差，请配合语音识别的使用场景，如避开嘈杂的环境等
  static const int ANDROID_ERR_SPEECH_QUAILTY = 7;

  /*
  *引擎忙
  * 一般是开发阶段的调用错误，出现原因是上一个会话尚未结束，就让SDK开始下一次识别。
  * SDK目前只支持单任务运行，即便创建多个实例，也只能有一个实例处于工作状态
  * */
  static const int ANDROID_ERR_MULTIPLE_TASK = 8;

  //没有录音权限 通常是没有配置录音权限：android.permission.RECORD_AUDIO
  static const int ANDROID_ERR_NO_PERM = 9;

  /*
  * 其它错误
  * 出现原因如：使用离线识别但未将EASR.so集成到程序中；离线授权的参数填写不正确；参数设置错误等。
  * */
  static const int ANDROID_ERR_OTHER = 10;

  /*
    * Android错误码
    * */

  static BaiduSpeechErrorResponse getErrorByCode(int errCode, TargetPlatform platform) {
    assert(platform == TargetPlatform.iOS || platform == TargetPlatform.android);

    Map<int, String> iosErrorMap = {
      2228226: '首次使用离线引擎请联网，并配置正确的app_id BDS_ASR_OFFLINE_APP_CODE, 绑定BundleId',
      2225219: '音频质量过低，无法识别',
      2228236: '识别失败，无法识别',
      2228231: 'dat模型文件不可用',
      3001: '协议参数错误',
      3002: '识别过程出错',
      3003: '没有找到匹配结果',
      3004: 'PID设置错误',
      3005: '音频质量过低，无法识别',
      3006: '语音录入过长，请勿超过60s',
    };

    Map<int, String> androidErrorMap = {
      1: '网络比较弱，请检测网络状态',
      2: '网络权限被禁用，或网络确实未连接',
      3: '未声明录音权限，或被安全软件限制，或录音设备被占用',
      4: 'appid和appkey的鉴权失败',
      5: '开发阶段的调用错误，需要开发者检测调用逻辑',
      6: '语音过长，请配合语音识别的使用场景，如避开嘈杂的环境等',
      7: '信噪比差，请配合语音识别的使用场景，如避开嘈杂的环境等',
      8: 'SDK目前只支持单任务运行，即便创建多个实例，也只能有一个实例处于工作状态',
      9: '没有录音权限',
      10: '开发阶段的调用错误，需要开发者检测调用逻辑'
    };

    return BaiduSpeechErrorResponse(
      errCode: errCode,
      errMessage: platform == TargetPlatform.iOS ? iosErrorMap[errCode] : androidErrorMap[errCode],
    );
  }
}
